package cn.itsource.interceptor;

import cn.itsource.domain.Account;
import cn.itsource.utils.AccountContext;
import ognl.Token;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Value("${client.login}")
    private String loginPath;

    /**
     * 进行两步判断，有携带token吗？
     * token是否正确？
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 设置相应格式为json格式，编码方式为utf-8
        response.setContentType("text/json;charset=utf-8");
        // 获取前端传递的参数,如果是null，说明是ajax请求
        String type = request.getParameter("type");
        // 判断是否为空，如果是空，就在请求头获取token，如果不是空，就在ajax请求获取
        String token = StringUtils.isBlank(type) ? request.getHeader("token") : request.getParameter("token");
        // 如果没有token就拦截不放行
        if(StringUtils.isBlank(token)) {
            if(StringUtils.isBlank(type)) {
                // 如果不为空，那么是ajax请求，那么直接返回json格式
                response.getWriter().write("{\"success\":false,\"code\":401}");
            } else {
                // 如果为空，说明是submit请求，
                // 重定向到登陆界面
                response.sendRedirect(loginPath);
            }
            return false;
        }
        Account accountData = AccountContext.getAccountData(token);
        if(accountData == null) {
            if(StringUtils.isBlank(type)) {
                response.getWriter().write("{\"success\":false,\"code\":401}");
            } else {
                response.sendRedirect(loginPath);
            }
            return false;
        }
        // 以上条件都判断完毕，可以放行
        return true;
    }
}
